/**
 * 文件名：SecurityConfig.java
 * 功能：Spring Security 安全配置类
 * 作用：配置路由权限控制、JWT 过滤器、密码加密方式等安全相关设置
 * 模块关系：
 *   - 注册 JwtAuthenticationFilter：将 JWT 过滤器添加到 Spring Security 过滤器链
 *   - 提供 PasswordEncoder Bean：供 AuthService 使用，实现 BCrypt 密码加密
 *   - 配置路由权限：/auth/** 公开，/user/** 需要认证
 *   - 禁用 CSRF 和 Session：实现无状态 REST API
 * 作者：白永康
 * 学号：2501210209
 */
package com.example.demo.security;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

/**
 * Spring Security 安全配置类
 * 配置 JWT 认证、路由权限控制、密码加密等
 */
@Configuration
@EnableWebSecurity
public class SecurityConfig {

    private final JwtAuthenticationFilter jwtAuthenticationFilter;

    /**
     * 构造函数，注入 JWT 过滤器
     * @param jwtAuthenticationFilter JWT 认证过滤器
     */
    public SecurityConfig(JwtAuthenticationFilter jwtAuthenticationFilter) {
        this.jwtAuthenticationFilter = jwtAuthenticationFilter;
    }

    /**
     * 密码加密器 Bean
     * 使用 BCrypt 算法对密码进行加密和验证
     * @return BCryptPasswordEncoder 实例
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    /**
     * 安全过滤器链配置
     * 配置路由权限、CSRF、CORS、Session 等安全策略
     * @param http HttpSecurity 对象
     * @return SecurityFilterChain 实例
     */
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf(csrf -> csrf.disable())
            .cors(cors -> cors.disable())
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/auth/**").permitAll()  // 允许注册和登录接口
                .requestMatchers("/api/apps/**").permitAll()  // 允许应用列表接口（可选）
                .requestMatchers("/user/**").authenticated()  // 受保护的用户接口
                .anyRequest().permitAll()
            )
            .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);

        return http.build();
    }
}
